package com.lang;

/**
 * 下载生命周期
 */
public interface DownloadLifeCycle<T extends DownloadConfig> {

    /**
     * 是否为断点下载
     *
     * @param config 配置信息
     * @return true 是断点下载， false 是初次开始下载
     */
    boolean isRestart(T config);

    /**
     * 从配置文件中检查下载是否已经完成
     *
     * @param config 配置信息
     * @return true已完成 false未完成
     */
    boolean checkTaskDone(T config);

    /**
     * 检查配置文件中的保存路径是否可用 并创创建输出流
     * 1.是否配置文件保存路径
     * 2.如果文件存在 检查覆盖参数是否允许覆盖
     * 3.尝试创建文件输出流
     *
     * @param config 配置信息
     */
    void saveFileOutputStream(T config);

    /**
     * 当下载开始时的操作
     *
     * @param config 配置信息
     */
    void whenStart(T config);

    /**
     * 当正常下载完成时的操作
     *
     * @param config 配置信息
     */
    void whenDone(T config);

    /**
     * 不管是否异常 最后都要做的操作
     *
     * @param config 配置信息
     */
    void whenFinish(T config);

    /**
     * 当发生异常时的操作
     *
     * @param config 配置信息
     * @param cause  错误信息
     */
    void whenException(T config, Throwable cause);
}
